﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Windows.Forms;
using Business_Entity;
using Business_Logic;
using PetSoft.GUI;

namespace PetSoft.GUI.Ventas
{
	
    public partial class GUIMantenimientoCliente : Form
    { 	    	
    	private List<BECliente> listaClientes;    	
    	private BECliente clienteSeleccionado;
    	
    	private List<BETipoDocumento> listaTipoDocumentos;
		private List<BESexo> listaSexos;
    	
    	public BECliente ClienteSeleccionado{
    		get{return this.clienteSeleccionado;}
    	}
    	
        public GUIMantenimientoCliente(Boolean buscarGestionar)
        {            
			InitializeComponent();
            inicializarComponentes();     
            if(buscarGestionar){ // buscar
        		EditarBTN.Visible = false;            	
            	EliminarBTN.Visible = false;
            	this.Text = "Buscar Cliente";
            }else{ // gestionar
            	AceptarBTN.Visible = false;
        		CancelarBTN.Visible = false;
            }
            
        }

        public GUIMantenimientoCliente(int tipoVentana){
        	InitializeComponent();
            inicializarComponentes();     
            
        	if(tipoVentana == 1){ // Buscar
        		EditarBTN.Visible = false;
            	//VerBTN.Visible = false;
            	EliminarBTN.Visible = false;
            	this.Text = "Buscar Cliente";
        	}else if(tipoVentana == 2){ // Gestionar
        		AceptarBTN.Visible = false;
        		CancelarBTN.Visible = false;
        	}
        }
        
        public void inicializarComponentes(){			
            
        	this.listaSexos = new List<BESexo>();
        	this.listaSexos.Add(new BESexo(-1,"<Seleccionar>"));
        	this.listaSexos.Add(new BESexo(1,"FEMENINO"));
        	this.listaSexos.Add(new BESexo(2,"MASCULINO"));        	
        	this.SexoCB.DataSource = listaSexos;
        	this.SexoCB.ValueMember = "idSexo";
        	this.SexoCB.DisplayMember = "descripcion";  
        	
        	BLTipoDocumento blTipoDocumento = new BLTipoDocumento();
        	this.listaTipoDocumentos = blTipoDocumento.obtenerTipoDocumento2();        	
        	TipoDocumentoCB.DataSource = listaTipoDocumentos;        	
        	TipoDocumentoCB.ValueMember = "idTipoDoc";
        	TipoDocumentoCB.DisplayMember = "descripcion";    

			this.CodigoTB.KeyPress+=new KeyPressEventHandler(Utils.SoloNumerosTB); 
			this.NumeroDocumentoTB.KeyPress +=new KeyPressEventHandler(Utils.SoloNumerosTB);
			this.CodigoTB.KeyPress += new KeyPressEventHandler(Utils.NoCaracteresRarosTB);
			this.NombresTB.KeyPress += new KeyPressEventHandler(Utils.NoCaracteresRarosTB);
			this.ApellidoPaternoTB.KeyPress += new KeyPressEventHandler(Utils.NoCaracteresRarosTB);
			this.ApellidoMaternoTB.KeyPress += new KeyPressEventHandler(Utils.NoCaracteresRarosTB);			
//			this.CodigoTB.KeyPress += new KeyPressEventHandler(buBuscar_Click);			
//			this.NombresTB.KeyPress += new KeyPressEventHandler(buBuscar_Click);
//			this.ApellidoPaternoTB.KeyPress += new KeyPressEventHandler(buBuscar_Click);
//			this.ApellidoMaternoTB.KeyPress += new KeyPressEventHandler(buBuscar_Click);
//			this.TipoDocumentoCB.SelectedIndexChanged += new EventHandler(buBuscar_Click);
//			this.NumeroDocumentoTB.KeyPress += new KeyPressEventHandler(buBuscar_Click);
//			this.SexoCB.SelectedIndexChanged += new EventHandler(buBuscar_Click);			
        }       
        
        void buBuscar_Click(object sender, EventArgs e)
        {
        	llenarGrilla();
        }
        
        public void llenarGrilla(){
        	try{
	        	
	        	ClienteDGV.Rows.Clear();        	
	        	
	        	//búsqueda total
	        	/*
	        	if(CodigoTB.Text.Equals("") && 
	        	   NombresTB.Text.Equals("") &&
	        	   ApellidoMaternoTB.Text.Equals("") && 
	        	   ApellidoPaternoTB.Text.Equals("") &&
	        	   Convert.ToInt16(TipoDocumentoCB.SelectedValue) == -1 &&
	        	   NumeroDocumentoTB.Text.Equals("") && 
	        	   Convert.ToInt16(SexoCB.SelectedValue) == -1){
	        		
	        		BLCliente blCliente =  new BLCliente();
	        		this.listaClientes = blCliente.buscarListaClientes();
	        		        		
	    			foreach(BECliente cliente in listaClientes){
	    				String[] fila = new String[]{
	        				false.ToString(),
	    					cliente.IdCliente.ToString(),
	    					cliente.Nombre,
	    					cliente.ApellidoPaterno,
	    					cliente.ApellidoMaterno,
	    					cliente.BeTipoDocumento.Descripcion,
	    					cliente.DocumentoIdentidad,
	    					cliente.Sexo   
	    				};
	    				ClienteDGV.Rows.Add(fila);    				
	    			}    			
	        		
	        	//búsqueda parcial
	        	}else{
	        		*/
	        		BLCliente blCliente =  new BLCliente();        	
		        	BECliente beCliente = new BECliente();
		        	if(CodigoTB.Text.Equals(""))
		        		beCliente.IdCliente = -1;
		        	else
		        		beCliente.IdCliente = int.Parse(CodigoTB.Text);
		        	beCliente.Nombre = NombresTB.Text;
		        	beCliente.ApellidoPaterno = ApellidoPaternoTB.Text;
					beCliente.ApellidoMaterno = ApellidoMaternoTB.Text;
					beCliente.BeTipoDocumento = new BETipoDocumento();									
					if(Convert.ToInt16(TipoDocumentoCB.SelectedValue) == -1){
						beCliente.BeTipoDocumento.IdTipoDoc = -1;
						beCliente.BeTipoDocumento.Descripcion = "";
						beCliente.DocumentoIdentidad = "";
					}
					else{
						beCliente.BeTipoDocumento.IdTipoDoc = Convert.ToInt16(TipoDocumentoCB.SelectedValue);
						beCliente.BeTipoDocumento.Descripcion = TipoDocumentoCB.Text;
						beCliente.DocumentoIdentidad = NumeroDocumentoTB.Text;
					}
					   					
					if(Convert.ToInt16(SexoCB.SelectedValue) == -1)
						beCliente.Sexo = "";
					else
						beCliente.Sexo = SexoCB.Text;        	
					
	        		this.listaClientes = blCliente.buscarListaClientes(beCliente);
	        			        		
	    			foreach(BECliente cliente in this.listaClientes){
	    				String[] fila = new String[]{
	        				false.ToString(),
	    					cliente.IdCliente.ToString(),
	    					cliente.Nombre,
	    					cliente.ApellidoPaterno,
	    					cliente.ApellidoMaterno,
	    					cliente.BeTipoDocumento.Descripcion,
	    					cliente.DocumentoIdentidad,
	    					cliente.Sexo        					
	    				};
	    				ClienteDGV.Rows.Add(fila);    				
	    			} 
				/*	        		
	        	}
	        	*/
	        	actualizarCantidadResultados(this.listaClientes.Count);
        	
        	}
        	catch(Exception ex){
        		Utils.MessageError("",ex);
        	}

        }
        
        void actualizarCantidadResultados(int i){
        	CantidadResultaLBL.Text = "Cantidad de clientes encontrados: "+i;
        }
        
        void FiltroDeBusquedaGBEnter(object sender, EventArgs e)
        {
        	
        }
        
        private void cerrarCliente(object sender, EventArgs e){
        	llenarGrilla();
		}
        
        void VerBTNClick(object sender, EventArgs e)
        {        	    
        	try{
        	
				int cont = 0;
				int aux = 0;
				int pos = 0;
				
				foreach (DataGridViewRow fila in ClienteDGV.Rows)
				{
					if (fila.Cells[0].Value != null && Convert.ToBoolean(fila.Cells[0].Value))
					{
						cont++;
						pos = aux;
					}
					aux++;
				}
				
				if (cont == 0)
				{
					Utils.MessageAviso("Seleccione un cliente");	
				}
				else if (cont == 1)
				{				
					DataGridViewRow fila = ClienteDGV.Rows[pos];
					if (fila.Cells[0].Value != null && Convert.ToBoolean(fila.Cells[0].Value))
					{
						BLCliente blCliente = new BLCliente();
						if(!blCliente.existeCliente(listaClientes[pos])){
							Utils.MessageAviso("El cliente fue eliminado anteriormente");
							llenarGrilla();
							return;
						}						
						
						GUI.Ventas.GUICliente v = new GUI.Ventas.GUICliente(listaClientes[pos],1);
						v.GuiMantenimientoCliente = this;				
						v.ShowDialog(this);					
					}
				}
				else if (cont > 1)
				{
					Utils.MessageAviso("Seleccione sólo un cliente");		
				}
				
		    	}
        	catch(Exception ex){
        		//MessageBox.Show(ex.ToString());
        	}

        }
        
        void GUIMantenimientoClienteLoad(object sender, EventArgs e)
        {		        	
			//Ahora debo extraer el siguiente código del siguiente cliente
        }               
        
        void NuevoBTNClick(object sender, EventArgs e)
        {        	
			GUI.Ventas.GUICliente v = new GUI.Ventas.GUICliente(4);
			v.removerTabMascotas();
			v.cambiarNombreVentana("Registrar nuevo cliente");
			v.GuiMantenimientoCliente = this;
			//v.Closed += new System.EventHandler(this.cerrarCliente);
			v.ShowDialog(this);
        }
        
        
        void TipoDocumentoCBSelectedIndexChanged(object sender, EventArgs e)
        {        	
        	NumeroDocumentoTB.Text = "";
        	if(Convert.ToInt16(TipoDocumentoCB.SelectedValue) != -1){
        		NumeroDocumentoTB.Enabled = true;
        		switch(Convert.ToInt16(TipoDocumentoCB.SelectedValue)){
        			case 1: 
        				NumeroDocumentoTB.MaxLength = 8;
        				break;
        			case 2: 
        				NumeroDocumentoTB.MaxLength = 11;
        				break;
        			case 3: 
        				NumeroDocumentoTB.MaxLength = 15;
        				break;
        		}          			        
        	}
        	else
        		NumeroDocumentoTB.Enabled = false;
        }       
        
        void EliminarBTNClick(object sender, EventArgs e)
        {
        	try{        	
	        	int cont = 0;	
				int aux = 0;	        	
				int pos = 0;				
				
				List<int> indiceClientes = new List<int>();
				List<int> posicionClientes = new List<int>();
				
				foreach (DataGridViewRow fila in ClienteDGV.Rows)
				{
					if (fila.Cells[0].Value != null && Convert.ToBoolean(fila.Cells[0].Value))
					{
						cont++;
						pos = aux;
						posicionClientes.Add(pos);						
						indiceClientes.Add(int.Parse(fila.Cells[1].Value.ToString()));
					}
					aux++;
				}
				
				if (cont == 0)
				{
					Utils.MessageAviso("Debe seleccionar al menos un cliente");	
				}			
				else if (cont > 0)
				{
					if (Utils.MessagePregunta("¿Está seguro que desea eliminar el(los) cliente(s) seleccionado(s)?")){
																		
						BLCliente blCliente = new BLCliente();
						BECliente beCliente = new BECliente();
						String msg = "";
						
						for(int i=0;i<indiceClientes.Count;i++){
							beCliente.IdCliente = indiceClientes[i];
																				
							msg = "";
							BLMascota blMascota = new BLMascota();
							int idMaster = blMascota.obtenerIDClienteNombre();							
							if(idMaster == beCliente.IdCliente){
								msg = msg + "No puede eliminar el cliente master";
								Utils.MessageAviso(msg);								
								continue;
							}
							
							msg = msg + "No se puede eliminar a "+listaClientes[posicionClientes[i]].Nombre+" "+
									listaClientes[posicionClientes[i]].ApellidoPaterno+" por:\n";
							if(blCliente.existePedidoVentaPendiente(beCliente) ){								
								msg = msg + "- tener uno o más pedidos de ventas pendientes\n";
							}
							
							if(blCliente.existeServiciosPendientesMascotas(beCliente)){
								msg = msg + "- tener una o más mascotas con servicios pendiente";								
							}							
						
							if(!msg.Equals("No se puede eliminar a "+listaClientes[posicionClientes[i]].Nombre+" "+
									listaClientes[posicionClientes[i]].ApellidoPaterno+" por:\n")){
								 Utils.MessageAviso(msg);
								continue;
							}
							
							int r = blCliente.eliminarCliente(beCliente);						
							if (r != 1)
								Utils.MessageError("Ha ocurrido un error al eliminar el cliente "+listaClientes[posicionClientes[i]].Nombre+" "+
								                   listaClientes[posicionClientes[i]].ApellidoPaterno);
						}
														        	        			        		        	
						llenarGrilla();
					}
						
				}	        		        	
        	}catch{
        		
        	}
        }
        
        void LimpiarBTNClick(object sender, EventArgs e)
        {
        	CodigoTB.Text = "";
        	NombresTB.Text = "";
        	ApellidoPaternoTB.Text = "";
        	ApellidoMaternoTB.Text = "";
        	TipoDocumentoCB.SelectedValue = -1;
        	NumeroDocumentoTB.Text = "";     
        	SexoCB.SelectedValue = -1;     	
        	ClienteDGV.Rows.Clear();        	
        	if(listaClientes != null) 
        		listaClientes.Clear();
        	SeleccionarDeseleccionarCHB.Checked = false;
        	actualizarCantidadResultados(0);
        }               
        
        void EditarBTNClick(object sender, EventArgs e)
        {
        	int cont = 0;
			int aux = 0;
			int pos = 0;
			
			foreach (DataGridViewRow fila in ClienteDGV.Rows)
			{
				if (fila.Cells[0].Value != null && Convert.ToBoolean(fila.Cells[0].Value))
				{
					cont++;
					pos = aux;
				}
				aux++;
			}
			
			if (cont == 0)
			{
				Utils.MessageAviso("Seleccione un cliente");	
			}
			else if (cont == 1)
			{				
				DataGridViewRow fila = ClienteDGV.Rows[pos];
				if (fila.Cells[0].Value != null && Convert.ToBoolean(fila.Cells[0].Value))
				{
					BLCliente blCliente = new BLCliente();
					if(!blCliente.existeCliente(listaClientes[pos])){
						Utils.MessageAviso("El cliente fue eliminado anteriormente");
						llenarGrilla();
						return;
					}
					//listaClientes[pos].FechaModificacion = DateTime.Now;
					
					String msg = "";
					
					if(Utils.esClienteMaster(listaClientes[pos])){
						msg = msg + "No puede eliminar el cliente master";
						Utils.MessageAviso(msg);								
						return;
					}
					
					GUI.Ventas.GUICliente v = new GUI.Ventas.GUICliente(listaClientes[pos],2);
					v.GuiMantenimientoCliente = this;
					//v.habilitarCampos();					
					v.ShowDialog(this);					
				}
			}
			else if (cont > 1)
			{
				Utils.MessageAviso("Seleccione sólo un cliente");		
			}
        }
        
        void AceptarBTNClick(object sender, EventArgs e)
        {
        	int cont = 0;
			int aux = 0;
			int pos = 0;
			
			foreach (DataGridViewRow fila in ClienteDGV.Rows)
			{
				if (fila.Cells[0].Value != null && Convert.ToBoolean(fila.Cells[0].Value))
				{
					cont++;
					pos = aux;
				}
				aux++;
			}
			
			if (cont == 0)
			{
				Utils.MessageAviso("Seleccione un cliente");	
			}
			else if (cont == 1)
			{								
				DataGridViewRow fila = ClienteDGV.Rows[pos];
				if (fila.Cells[0].Value != null && Convert.ToBoolean(fila.Cells[0].Value))
				{					
//					if(Utils.esClienteMaster(listaClientes[pos])){
//						Utils.MessageAviso("No puede seleccionar al cliente master en esta búsqueda");
//						return;						
//					}						
//					
					this.clienteSeleccionado = listaClientes[pos];
					//MessageBox.Show(clienteSeleccionado.Nombre);
					this.Dispose();
				}
			}
			else if (cont > 1)
			{
				Utils.MessageAviso("Seleccione sólo un cliente");		
			}
        }
        
        void CheckBox1CheckedChanged(object sender, EventArgs e)
        {
        	if(listaClientes != null && listaClientes.Count != 0){
        		
	        	if(SeleccionarDeseleccionarCHB.Checked)	        			        	
					foreach (DataGridViewRow fila in ClienteDGV.Rows)	        		
						fila.Cells[0].Value = true;						        			        
	        	
	        	if(!SeleccionarDeseleccionarCHB.Checked)	        			        	
	        		foreach (DataGridViewRow fila in ClienteDGV.Rows)					
						fila.Cells[0].Value = false;						        

        	}else{
        		//MessageBox.Show("No hay elementos para seleccionar","Aviso");
        		//SeleccionarDeseleccionarCHB.Checked = false;
        	}	        	
        }
        
        void SexoCBSelectedIndexChanged(object sender, EventArgs e)
        {
        	//buBuscar_Click(sender,e);
        }        
        
        void ClienteDGVCellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
        	try{        	
	        	//MessageBox.Show(listaClientes[e.RowIndex].Nombre);
	        	if(Convert.ToBoolean(ClienteDGV.Rows[e.RowIndex].Cells[0].Value))
	        		ClienteDGV.Rows[e.RowIndex].Cells[0].Value = false;
	        	else
	        		ClienteDGV.Rows[e.RowIndex].Cells[0].Value = true;
	        	//this.Dispose();
        	}catch{
        		
        	}
        }        
        
        void CancelarBTNClick(object sender, EventArgs e)
        {
        	//if(Utils.MessagePregunta("¿Está seguro que desea cancelar esta acción?"))
        		this.Dispose();
        }
    }
}
